<?php
/**
 * 分类类
 */
namespace app\admin\controller;
use app\admin\controller\Common;
class Category extends Common{

	/**
	 * 展示分类列表页
	 */
	public function lst(){
		
		//分配模版标头信息变量
		$this->setPageTitle("分类列表","添加分类",url('addShow'));

		//获取分类
		$cats = db('category')->select();
		$cats = getLevelTree(  $cats, 'cid', 'parent_id', $pid=0,$level=0  );//获取带有层级的树状结构
		
		$attrModel = db('attrs');
		foreach ( $cats as $k => $v ) {

			if( $v['filter'] ) {

				$attrs = $attrModel->where('aid','in',$v['filter'])->column('attr_name');
				
				$cats[$k]['filter'] = implode(',', $attrs);
				
			}

			$cats[$k]['is_nav'] = $v['is_nav'] ? '是': '否';
			$cats[$k]['status'] = $v['status'] ? '是': '否';

		}
		
		//分配变量
		$this->assign('cats',$cats);

		//展示视图
		return $this->fetch();
	}

	/**
	 * 展示分类添加页
	 */
	public function addShow(){

		//分配模版标头信息变量
		$this->setPageTitle("添加分类","分类列表",url('lst'));

		//获取分类信息
		$cats = db('category')->field('cid,cat_name,parent_id')->select();
		$cats = getLevelTree(  $cats, 'cid', 'parent_id', $pid=0,$level=0  );

		//获取类型
		$types = db('type')->select();

		//分配变量
		$this->assign('types',$types);
		$this->assign('cats',$cats);

		//展示视图
		return $this->fetch('add');
	}

	/**
	 * 添加分类
	 */
	public function add(){

		//安全处理 
		if( !request()->isPost() ){

			$this->error('您访问的页面不存在！');

		}

		//字段验证
		$validate = \think\Loader::validate('Category');
		if( !$validate->check(input('post.')) ){

			$this->error( $validate->getError() );

		}

		//处理过滤条件
		$attrIds = array_unique( array_map('intval', array_filter( input('post.attr_id/a') ) ) );//去空去重转整型
		sort($attrIds);//排序
		$attrIds = implode(',', $attrIds);//将属性id连接成字符串
		

		//收集数据
		$data['parent_id'] = input('post.pid')+0;
		$data['cat_name'] = input('post.category_name');
		$data['is_nav'] = input('post.navShow')+0;
		$data['status'] = input('post.catShow')+0;
		$data['filter'] = $attrIds;
		$data['seo_keyword'] = input('post.keyword');
		$data['seo_desc'] = input('post.desc');
		$data['price_num'] = input('post.priceNum')+0;
		$data['sort'] = input('post.sort')+0;
		
		//判断分类名是否存在
		$db = db('category');
		if( $db->getbyCatName($data['cat_name']) ){

			$this->error('该分类名已经存在，请更换分类名！');

		}

		//添加分类
		if( $db->strict(true)->insert($data) ){

			//获取最后执行的sql语句
			$sql = $db->getLastSql();

			//添加管理员日志
			adminLog( session('id'), '添加了分类：'.$data['cat_name'], $sql );

			$this->success('添加成功！',url('lst'));

		}else{

			$this->error('添加失败！');
			
		}

	}

	/**
	 * 展示分类修改页
	 */
	public function editShow(){

		//分配模版标头信息变量
		$this->setPageTitle("修改分类","分类列表",url('lst'));

		//获取全部分类信息
		$db = db('category');
		$cats = $db->field('cid,cat_name,parent_id')->select();
		$cats = getLevelTree(  $cats, 'cid', 'parent_id', $pid=0,$level=0 );

		//获取类型
		$types = db('type')->select();

		//获取分类
		$id = input('id')+0;
		$category = $db->find($id);

		//获取分类的筛选属性
		$attrs = [];//存放自身拥有的属性信息
		$attrsAll = [];//存放属性所属类型下的所有属性信息

		if( $category['filter'] ){//存在筛选条件

			//获取该分类所拥有的筛选属性
			$attrModel = db('attrs');
			$attrs = $attrModel->field('aid,tid,attr_name')->select($category['filter']);

			//获取选择属性下的所属类型id
			$tid = [];
			foreach ($attrs as $v) {
				$tid[] = $v['tid'];
			}
			$tid = implode(',', array_unique($tid));

			//获取类型id下所有的属性
			$data = $attrModel->field('aid,tid,attr_name')->where( ['tid'=>['in',$tid],'attr_type'=>1] )->select();

			foreach ($data as $k => $v) {
				$attrsAll[$v['tid']][$k]['aid'] = $v['aid'];
				$attrsAll[$v['tid']][$k]['attr_name'] = $v['attr_name'];
			}

			
		}
				
		//分配变量
		$this->assign('types',$types);
		$this->assign('cats',$cats);
		$this->assign('category',$category);
		$this->assign('attrs',$attrs);
		$this->assign('attrsAll',$attrsAll);

		//展示视图
		return $this->fetch('edit');
	}

	/**
	 * 修改分类
	 */
	public function edit(){

		//安全处理 
		if( !request()->isPost() ){

			$this->error('您访问的页面不存在！');

		}

		//字段验证
		$validate = \think\Loader::validate('Category');
		if( !$validate->check(input('post.')) ){

			$this->error( $validate->getError() );

		}

		//如果父级id是自己的下级或自己就不允许更新
		$db = db('category');
		$id = input('post.id')+0;
		$pid = input('post.pid')+0;
		$ids = $db->where( 'parent_id','=',$id )->column('cid');//获取子集id
		$ids[]=$id;//将自身id放入
		if( in_array( $pid, $ids ) ){
			$this->error('不能将自身或子集作为父级分类！');
		}

		//处理过滤条件
		$attrIds = array_unique( array_map('intval', array_filter( input('post.attr_id/a') ) ) );//去空去重转整型
		sort($attrIds);//排序
		$attrIds = implode(',', $attrIds);//将属性id连接成字符串

		//收集数据
		$data['parent_id'] = $pid;
		$data['cat_name'] = input('post.category_name');
		$data['is_nav'] = input('post.navShow')+0;
		$data['status'] = input('post.catShow')+0;
		$data['filter'] = $attrIds;
		$data['seo_keyword'] = input('post.keyword');
		$data['seo_desc'] = input('post.desc');
		$data['price_num'] = input('post.priceNum')+0;
		$data['sort'] = input('post.sort')+0;
		$data['cid'] = $id;
		
		//判断是否修改了分类名
		$catName = $db->where( 'cid','=',$data['cid'] )->value('cat_name');

		if(  $catName!=$data['cat_name']  ){

			//判断分类名是否存在
			if( $db->getbyCatName($data['cat_name']) ){

				$this->error('该类型名已经存在，请更换类型名！');

			}

		}

		//修改分类
		if( $db->strict(true)->update($data) ){

			//获取最后执行的sql语句
			$sql = $db->getLastSql();

			//添加管理员日志
			adminLog( session('id'), '更新了分类：'.$data['cat_name'], $sql );

			$this->success('更新成功！',url('lst'));

		}else{

			$this->error('更新失败！');
			
		}		

	}

	/**
	 * 异步删除分类
	 */
	public function del(){

		//安全处理
		if(!request()->isAjax()) {

			$this->error('你访问的页面不存在！');

		}

		//收集信息
		$id = input('id')+0;
		$name = input('name');

		//判断是否有子分类
		$cateModel = db('category');
		if($cateModel->where('parent_id = '.$id)->count()){

			echo json_encode(['status'=>0,'msg'=>'该分类下存在子分类，请先删除子分类！']);
			die;
		}

		//删除分类
		if($cateModel->delete($id)) {

			//获取最后执行的sql语句
			$sql = $cateModel->getLastSql();

			//添加管理员日志
			adminLog( session('id'), '删除了分类：'.$name, $sql );

			echo json_encode(['status'=>1,'msg'=>'删除成功']);
		
		}else {

			echo json_encode(['status'=>0,'msg'=>'删除失败']);

		}

	}


	// /**
	//  * 异步排序
	//  */
	// public function sort(){

	// 	//安全处理 
	// 	if( !request()->isAjax() ){

	// 		$this->error('您访问的页面不存在！');

	// 	}

	// 	//判断图片是否存在
	// 	if( !is_numeric( input('sort') ) || !is_numeric( input('id') ) ){
	// 		echo json_encode(['status'=>false,'msg'=>'请输入合法信息！']);
	// 		die;
	// 	}

	// 	//获取信息
	// 	$data['sort'] = input('sort')+0;
	// 	$data['bid'] = input('id')+0;

	// 	//修改排序
	// 	if( db('category')->update($data) ){

	// 		echo json_encode(['status'=>true,'msg'=>'修改成功！']);

	// 	}else{

	// 		echo json_encode(['status'=>false,'msg'=>'修改失败！']);

	// 	}



	// }

	/**
	 * 异步获取某个类型下的属性
	 */
	public function getAttrs(){

		//安全处理 
		if( !request()->isAjax() ){

			$this->error('您访问的页面不存在！');

		}

		//获取信息
		$id = input('id')+0;

		//获取属性
		$field = 'aid,attr_name';
		
		if( $attrs = db('attrs')->field($field)->where( ['tid'=>$id,'attr_type'=>1] )->select() ){

			echo json_encode($attrs);

		}else{

			echo false;

		}

	}


}

